package com.dtf.core.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.dtf.core.common.utils.UUIDGenerator;
import com.dtf.core.common.dao.mysql.MySQLUtils;


/**
 * 日常工具类，提供String、List、Map的一些日常操作，减少多于的判断
 * @author deng.tengfei
 *
 */
public class Const {
	
	private static Map getEmptyMap(){
		return new HashMap() ;
	}
	
	public static boolean containValue(Map m , String name ){
		return m.get(name) != null ;
	}
	
	/**
	 * 判断是否存在这个name,如果为空或者""返回false
	 * @param m
	 * @param name
	 * @return
	 */
	public static  boolean containStrValue(Map m , String name) {
		if( !containValue( m , name ) )
			return false ;
		String t = (String)m.get(name) ;
		return t != null && !"".equals(t.trim()) ;
	}
	
	/**
	 * 直接从Map中获取String，如果为null，返回""
	 * @param m
	 * @param name
	 * @return
	 */
	public static  String getStrValue(Map m , String name) {
		Object t = m.get(name) ;
		if(t == null )
			return "" ;
		return m.get(name)+"" ;
	}
	
	/**
	 * 直接从Map中获取long对象
	 * @param m
	 * @param name
	 * @return
	 */
	public static long getLongValue(Map m,String name){
		Object t = m.get(name) ;
		if(t == null)
			return 0 ;
		return Long.valueOf(t+"");
	}
	
	public static int getIntValue(Map m,String name){
		Object t = m.get(name) ;
		if(t == null)
			return 0 ;
		return Integer.valueOf(t+"");
	}
	
	public static int getPageIndex(Map m){
		int pageIndex = getIntValue(m, "pageIndex");
		if (pageIndex == 0) {
			pageIndex = 1;
		}
		return pageIndex;
	}
	
	/**
	 * 获取分页参数，默认为10
	 * @param m
	 * @return
	 */
	public static int getPageSize(Map m){
		int pageSize = getIntValue(m, "pageSize");
		if (pageSize == 0) {
			pageSize = 10;
		}
		return pageSize;
	}
	
	/**
	 * 判断字符串是否为空，如果为null或者""返回false
	 * @param str
	 * @return
	 */
	public static boolean strIsEmpty(String str){
		if(str == null || "".equals(str.trim())){
			return true;
		}
		return false;
	}
	
	/**
	 * 判断两个字符串是否相等，如果两个为空的情况也会返回true
	 * @param str1
	 * @param str2
	 * @return
	 */
	public static boolean strEquals(String str1,String str2){
		//如果两个为空的情况，会相等，直接返回true
		if (str1 == str2) {
			return true;
		}
		//如果两个其中有一个为空的情况，肯定不相等
		if (str1 == null || str2 == null) {
			return false;
		}
		if (!str1.equals(str2)) {
			return false;
		}
		return true;
	}
	
	/**
	 * 将字符串两头空格去除，如果字符串为null，也会返回""
	 * @param str
	 * @return
	 */
	public static String strTrim(String str){
		if (str == null) {
			str = "";
		}
		return str.trim();
	}
	
	/**
	 * 判断List是否为空
	 * @param list
	 * @return
	 */
	public static boolean listIsEmpty(List list){
		if(list == null || list.size() == 0){
			return true;
		}
		return false;
	}
	
	/**
	 * 获取唯一ID，建议全体人员使用此方式获取统一格式ID
	 * @return
	 */
	public static String getUUID(){
//		return UUIDGenerator.getInst().getGeneratorID();
		return UUIDGenerator.getInst().getUUID32();
	}
	
	/**
	 * 将Map转换为bean
	 * @param map
	 * @param pojoClass
	 * @return bean
	 * @throws Exception
	 */
	public static Object mapCoverToBean(Map map, Class pojoClass){
		return MySQLUtils.coverMapToBean(map, pojoClass);
	}
	
	/**
	 * 复制源对象和目标对象的属性值
	 *
	 */
	public static void copy(Object from, Object to) 
								throws Exception{
		
		Class sourceClass = from.getClass();//得到对象的Class
		Class targetClass = to.getClass();//得到对象的Class
		
		Field[] sourceFields = sourceClass.getDeclaredFields();//得到Class对象的所有属性
		Field[] targetFields = targetClass.getDeclaredFields();//得到Class对象的所有属性
		
		for(Field sourceField : sourceFields){
			String name = sourceField.getName();//属性名
			Class type = sourceField.getType();//属性类型
			
			String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
			
			Method getMethod = sourceClass.getMethod("get" + methodName);//得到属性对应get方法
			
			Object value = getMethod.invoke(from);//执行源对象的get方法得到属性值
			
			for(Field targetField : targetFields){
				String targetName = targetField.getName();//目标对象的属性名
				
				if(targetName.equals(name)){
					Method setMethod = targetClass.getMethod("set" + methodName, type);//属性对应的set方法
					
					setMethod.invoke(to, value);//执行目标对象的set方法
				}
			}
		}
	}
}
